package com.example.myblog_ssm.common;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 22479
 * Date: 2023-03-24
 * Time: 11:33
 */

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * md5 + 盐 密码加密工具
 */
public class PasswordUtils {
    /**
     * 1.加盐并生成最终密码
     *
     * @param password 明文密码
     * @return 保存到数据中 的最终密码
     */
    public static String encrypt(String password) {
        //1.产生盐值 通过UUID
        String salt = UUID.randomUUID().toString().replace("-", "");
        //2.生成加盐之后的密码MD5(salt + saltpassword)
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        //3.生成最终密码 【约定格式：32位盐值+$+32位加盐之后的密码】   --注意转义  $是通配符
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 2. 核实用户登录时候输入的密码
     * 用户输入的密码 + salt  -->生成加盐的密码（方法1的重载）
     *
     * @param passWord 明文
     * @param salt     固定的盐 (从数据库中提取出来)
     * @return 最终的密码
     */
    public static String encrypt(String passWord, String salt) {
        // 1.生成一个加盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + passWord).getBytes());
        //2.生成最终的密码 --【约定格式：32位盐值+$+32位加盐之后的密码】
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 3.验证密码
     *
     * @param inputPassword 用户输入的明文密码
     * @param finalPassword 数据库保存的最终密码
     * @return
     */
    public static Boolean check(String inputPassword, String finalPassword) {
        if (StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword) &&
                finalPassword.length() == 65) {
            //1.得到盐值
            String salt = finalPassword.split("\\$")[0];
            //2.使用之前加密的步骤,将明文密码和已经得到的盐值进行比较
            String confirmPassword = encrypt(inputPassword, salt);
            //3.比较是否相同
            return confirmPassword.equals(finalPassword);
        }
        return false;
    }

    public static void main(String[] args) {
        String p1 = "123456";
        String finalP1 = encrypt(p1);
        System.out.println("验证密码是否相同:" + check("12345", finalP1));
        System.out.println("验证密码是否相同:" + check("123456", finalP1));
    }
}
